It is surprising that Donald J Trump became the US president last year. He made hard work of beating Hilary Clinton and has almost finished his first year in office. People seem like getting adapted to this new president, but will he win again?

In this analysis, we select presidents’ first inaugural speeches to track whether these speeches indicate a second term of office. By comparing the different patterns between presidents with 2 or more terms and those who only have 1 term in office, we will get some interesting facts about these groups and we can also use the pattern extracted anticipating the future of Trump.

Also, some people believe that Trump is not that special as a Republican president. When George Bush was in his term, he also did something laughable in public. So, we will take this factor into consideration and further break the data into democratic presidents and republican presidents.


0 - Check and install needed packages. Arrange the data. Load the libraries and functions.


This notebook was prepared with the following environmental settings.

print(R.version)
               _                           
platform       x86_64-apple-darwin13.4.0   
arch           x86_64                      
os             darwin13.4.0                
system         x86_64, darwin13.4.0        
status                                     
major          3                           
minor          3.2                         
year           2016                        
month          10                          
day            31                          
svn rev        71607                       
language       R                           
version.string R version 3.3.2 (2016-10-31)
nickname       Sincere Pumpkin Patch       

1 - WordCloud

###first_term_demo     subset of inaug list
###first_demo          name
###tdm_first_demo      tdm file 
###WordCloud plot
###all
#op = par(mfrow=c(1,2),mar = c(0, 0, 3, 0))
par(mfrow=c(3,2))
wordcloud(tdm_first$term, tdm_first$count,
          scale=c(2,0.5),
          max.words=50,
          min.freq=1,
          random.order=FALSE,
          rot.per=0.3,
          use.r.layout=T,
          random.color=FALSE,
          colors=brewer.pal(9,"Reds"))
title(main = '1 term Presidents')
wordcloud(tdm_second$term, tdm_second$count,
          scale=c(2,0.5),
          max.words=50,
          min.freq=1,
          random.order=FALSE,
          rot.per=0.3,
          use.r.layout=T,
          random.color=FALSE,
          colors=brewer.pal(9,"Purples"))
title(main = '2 or more term Presidents')
###demo
wordcloud(tdm_first_demo$term, tdm_first_demo$count,
          scale=c(2,0.5),
          max.words=50,
          min.freq=1,
          random.order=FALSE,
          rot.per=0.3,
          use.r.layout=T,
          random.color=FALSE,
          colors=brewer.pal(9,"Reds"))
title(main = 'Democratics only have one term')
wordcloud(tdm_second_demo$term, tdm_second_demo$count,
          scale=c(2,0.5),
          max.words=50,
          min.freq=1,
          random.order=FALSE,
          rot.per=0.3,
          use.r.layout=T,
          random.color=FALSE,
          colors=brewer.pal(9,"Purples"))
title(main = 'Democratics have two or more terms')
###repub
wordcloud(tdm_first_repub$term, tdm_first_repub$count,
          scale=c(2,0.5),
          max.words=50,
          min.freq=1,
          random.order=FALSE,
          rot.per=0.3,
          use.r.layout=T,
          random.color=FALSE,
          colors=brewer.pal(9,"Reds"))
title(main = 'Republican with only one term')
wordcloud(tdm_second_repub$term, tdm_second_repub$count,
          scale=c(2,0.5),
          max.words=50,
          min.freq=1,
          random.order=FALSE,
          rot.per=0.3,
          use.r.layout=T,
          random.color=FALSE,
          colors=brewer.pal(9,"Purples"))
title(main = 'Republican with two or more terms')


All groups have their own special WordClouds, but we still can find some differences between one-term and two-term presidents:


###trump
wordcloud(tdm.trump$term, tdm.trump$count,
          scale=c(2,0.5),
          max.words=50,
          min.freq=1,
          random.order=FALSE,
          rot.per=0.3,
          use.r.layout=T,
          random.color=FALSE,
          colors=brewer.pal(9,"Oranges"))
title(main = 'Trump ')


Trump has a relatively special WordCloud as he talks a lot about Obama. From the WordCloud, Trump have words like “america”, “dreams”, “”jobs" indicating that he talks more about how to make America thrive again and how to bring more jobs. Trump gains lots of support from blue-collars who place hope of changing their living status, but it might not benefit him when running for his second term.

2 - Length of Sentences

###sentence.list         sentence list of all file in dir
###sentence.list.all     sentence list of all file group by one-term and second-term
###setence.list.demo
###setence.list.repub
###all
sentence.list.all=filter(sentence.list, File%in%c(first_term$File,second_term$File))
sentence.list.all$Group=ifelse(sentence.list.all$File%in%first_term$File,"first","second")
#sentence.list.all$avg.word<-ifelse(sentence.list.all$Group=="first",sentence.list.all$word.count/length(first),sentence.list.all$word.count/length(second))
beeswarm(word.count~Group, 
         data=sentence.list.all,
         horizontal = FALSE, 
         pch=16, col=c("red","purple"),
         cex=0.8, cex.axis=1, cex.lab=1.2,
         las=2,ylab="Number of words",
         xlab="",las=1,
         main="Inauguartion speeches")

###demo
sentence.list.demo=filter(sentence.list, File%in%c(first_term_demo$File,second_term_demo$File))
sentence.list.demo$Group=ifelse(sentence.list.demo$File%in%first_term_demo$File,"first_demo","second_demo")
#sentence.list.demo$avg.word<-ifelse(sentence.list.demo$Group=="first_demo",sentence.list.demo$word.count/length(first_demo),sentence.list.demo$word.count/length(second_demo))
beeswarm(word.count~Group, 
         data=sentence.list.demo,
         horizontal = FALSE, 
         pch=16, col=c("red","purple"),
         cex=0.8, cex.axis=1, cex.lab=1.2,
         las=2,ylab="Number of words",
         xlab="",las=1,
         main="Inauguartion speeches")

###repub
sentence.list.repub=filter(sentence.list, File%in%c(first_term_repub$File,second_term_repub$File))
sentence.list.repub$Group=ifelse(sentence.list.repub$File%in%first_term_repub$File,"first_repub","second_repub")
#sentence.list.repub$avg.word<-ifelse(sentence.list.repub$Group=="first_repub",sentence.list.repub$word.count/length(first_repub),sentence.list.repub$word.count/length(second_repub))
beeswarm(word.count~Group, 
         data=sentence.list.repub,
         horizontal = FALSE, 
         pch=16, col=c("red","purple"),
         cex=0.8, cex.axis=1, cex.lab=1.2,
         las=2,ylab="Number of words",
         xlab="",las=1,
         main="Inauguartion speeches")


Only first inaugural speeches are picked. There are 23 one-term presidents vs 17 second-term presidents; 9 one-term democratic presidents vs 6 two-term democratic presidents; 10 one-term republican presidents vs 7 two-term republican presidents. As the number of presidents in each group differ, the analysis become more complicated. However, we can still see some patterns:


###Trump
sentence.to=filter(sentence.list, File%in%c("DonaldJTrump","BarackObama"))
sentence.to$Group=ifelse(sentence.to$File=="DonaldJTrump","Trump","Obama")
beeswarm(sentence.to$word.count~Group,
         data=sentence.to,
         horizontal = FALSE,
         pch=16, col=brewer.pal(3,"Dark2"),
         cex=0.8, cex.axis=1, cex.lab=1.2,
         las=2,ylab="Number of words",
         xlab="",las=1,
         main="Inauguartion speeches")


Compared to Obama’s first-term inaugural speech, Trump has some extra long sentences. Trump has a specially even structure of sentence length which is closest the one-term republican presidents compared to other groups.


3 - Sentiment

par(mfrow=c(3,2))
emo.barplot<-function(group,data){
  par(mar=c(4, 6, 2, 1))
  emo.means=colMeans(select(subset(data,data$Group==group), anger:trust)>0.01,na.rm=TRUE)
  barplot(emo.means, las=2, col=brewer.pal(8,"Set3"), horiz=T,border=F,main=group)
}
 ###all
emo.barplot("first",sentence.list.all)
emo.barplot("second",sentence.list.all)
###demo
emo.barplot("first_demo",sentence.list.demo)
emo.barplot("second_demo",sentence.list.demo)
###repub
emo.barplot("first_repub",sentence.list.repub)
emo.barplot("second_repub",sentence.list.repub)


We can see that the distributions of emotions are similar among those groups:


###Trump
 emo.means=colMeans(select(subset(sentence.list.all,sentence.list.all$President=="Donald J. Trump"), anger:trust)>0.01,na.rm=TRUE)
 barplot(emo.means, las=2, col=brewer.pal(8,"Set3"), horiz=T,border=F, main="Donald J. Trump")


Trump has relatively large difference between joy and fear and less emotion of fear in his inaugural speech, but he has far less emotion of sadness compared to surprise in his speech. From the joy and fear pattern, Trump has greater possibility to be a one-term president, but he also gets the change to be two-term president from sadness and surprise pattern.


4 - Conclusion




We can see that there are some special patterns between one-term presents and two-term president. Only through the analysis above, I will anticipate that Trump will not have his second term:

However, until now there is not yet a strong competitors appearing, and even well-designed polls cannot give a exact anticipation of election result. I believe we cannot make a conclusion by only referencing inaugural speeches, but it is still fun to see this kind of the analysis.



Ci0tLQp0aXRsZTogIkRvZXMgVHJ1bXAncyBpbmF1Z3VyYWwgc3BlZWNoIGluZGljYXRlIGhpcyBzZWNvbmQgdGVybSBpbiBvZmZpY2U/IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpcClwKCiFbXShodHRwczovL2kucGluaW1nLmNvbS83MzZ4LzEzL2M3LzM2LzEzYzczNmZmNDllNjNmMzFjNTExN2E4NGVmYWZkYWY1LS1saXN0LW9mLXByZXNpZGVudHMtdmVuZGV0dGEuanBnKXt3aWR0aD01MCV9CgpcCgpJdCBpcyBzdXJwcmlzaW5nIHRoYXQgRG9uYWxkIEogVHJ1bXAgYmVjYW1lIHRoZSBVUyBwcmVzaWRlbnQgbGFzdCB5ZWFyLiBIZSBtYWRlIGhhcmQgd29yayBvZiBiZWF0aW5nIEhpbGFyeSBDbGludG9uIGFuZCBoYXMgYWxtb3N0IGZpbmlzaGVkIGhpcyBmaXJzdCB5ZWFyIGluIG9mZmljZS4KUGVvcGxlIHNlZW0gbGlrZSBnZXR0aW5nIGFkYXB0ZWQgdG8gdGhpcyBuZXcgcHJlc2lkZW50LCBidXQgd2lsbCBoZSB3aW4gYWdhaW4/CgpJbiB0aGlzIGFuYWx5c2lzLCB3ZSBzZWxlY3QgcHJlc2lkZW50cycgZmlyc3QgaW5hdWd1cmFsIHNwZWVjaGVzIHRvIHRyYWNrIHdoZXRoZXIgdGhlc2Ugc3BlZWNoZXMgaW5kaWNhdGUgYSBzZWNvbmQgdGVybSBvZiBvZmZpY2UuCkJ5IGNvbXBhcmluZyB0aGUgZGlmZmVyZW50IHBhdHRlcm5zIGJldHdlZW4gcHJlc2lkZW50cyB3aXRoIDIgb3IgbW9yZSB0ZXJtcyBhbmQgdGhvc2Ugd2hvIG9ubHkgaGF2ZSAxIHRlcm0gaW4gb2ZmaWNlLCB3ZSB3aWxsIGdldCBzb21lIGludGVyZXN0aW5nIGZhY3RzIGFib3V0IHRoZXNlIGdyb3VwcyBhbmQgd2UgY2FuIGFsc28gdXNlIHRoZSBwYXR0ZXJuIGV4dHJhY3RlZCBhbnRpY2lwYXRpbmcgdGhlIGZ1dHVyZSBvZiBUcnVtcC4KCkFsc28sIHNvbWUgcGVvcGxlIGJlbGlldmUgdGhhdCBUcnVtcCBpcyBub3QgdGhhdCBzcGVjaWFsIGFzIGEgUmVwdWJsaWNhbiBwcmVzaWRlbnQuIFdoZW4gR2VvcmdlIEJ1c2ggd2FzIGluIGhpcyB0ZXJtLCBoZSBhbHNvIGRpZCBzb21ldGhpbmcgbGF1Z2hhYmxlIGluIHB1YmxpYy4gU28sIHdlIHdpbGwgdGFrZSB0aGlzIGZhY3RvciBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIGZ1cnRoZXIgYnJlYWsgdGhlIGRhdGEgaW50byBkZW1vY3JhdGljIHByZXNpZGVudHMgYW5kIHJlcHVibGljYW4gcHJlc2lkZW50cy4KClwKCgojIyAwIC0gQ2hlY2sgYW5kIGluc3RhbGwgbmVlZGVkIHBhY2thZ2VzLiBBcnJhbmdlIHRoZSBkYXRhLiBMb2FkIHRoZSBsaWJyYXJpZXMgYW5kIGZ1bmN0aW9ucy4gCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpzZXR3ZCgifi9EZXNrdG9wLzUyNDNhZHMvRmFsbDIwMTctUHJvajEtY3cyOTc0IikKcGF0aDwtcGFzdGUwKGdldHdkKCksIi9kYXRhL0luYXVndXJhbFNwZWVjaGVzLyIpCmZvbGRlci5wYXRoPXBhc3RlMChnZXR3ZCgpLCIvZGF0YS9JbmF1Z3VyYWxTcGVlY2hlcy8iKQoKIyMjbG9hZCBwYWNrYWdlcwpwYWNrLnBhdGg9cGFzdGUwKGdldHdkKCksIi9saWIvUGFja2FnZS5SIikKc291cmNlKHBhY2sucGF0aCkKCiMjI3Byb2Nlc3NpbmcgZGF0YQpkYXRhLnBhdGg9cGFzdGUwKGdldHdkKCksIi9saWIvRGF0YS5SIikKc291cmNlKGRhdGEucGF0aCkKCmBgYAoKXApUaGlzIG5vdGVib29rIHdhcyBwcmVwYXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCBzZXR0aW5ncy4KCgpgYGB7cn0KcHJpbnQoUi52ZXJzaW9uKQpgYGAKCgojIyAxIC0gV29yZENsb3VkCmBgYHtyLGZpZy5oZWlnaHQgPSA0LjUsZmlnLndpZHRoID0gNn0KIyMjZmlyc3RfdGVybV9kZW1vICAgICBzdWJzZXQgb2YgaW5hdWcgbGlzdAojIyNmaXJzdF9kZW1vICAgICAgICAgIG5hbWUKIyMjdGRtX2ZpcnN0X2RlbW8gICAgICB0ZG0gZmlsZSAKCgojIyNXb3JkQ2xvdWQgcGxvdAoKIyMjYWxsCiNvcCA9IHBhcihtZnJvdz1jKDEsMiksbWFyID0gYygwLCAwLCAzLCAwKSkKCnBhcihtZnJvdz1jKDMsMikpCndvcmRjbG91ZCh0ZG1fZmlyc3QkdGVybSwgdGRtX2ZpcnN0JGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlJlZHMiKSkKdGl0bGUobWFpbiA9ICcxIHRlcm0gUHJlc2lkZW50cycpCgp3b3JkY2xvdWQodGRtX3NlY29uZCR0ZXJtLCB0ZG1fc2Vjb25kJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlB1cnBsZXMiKSkKdGl0bGUobWFpbiA9ICcyIG9yIG1vcmUgdGVybSBQcmVzaWRlbnRzJykKCiMjI2RlbW8Kd29yZGNsb3VkKHRkbV9maXJzdF9kZW1vJHRlcm0sIHRkbV9maXJzdF9kZW1vJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlJlZHMiKSkKdGl0bGUobWFpbiA9ICdEZW1vY3JhdGljcyBvbmx5IGhhdmUgb25lIHRlcm0nKQoKd29yZGNsb3VkKHRkbV9zZWNvbmRfZGVtbyR0ZXJtLCB0ZG1fc2Vjb25kX2RlbW8kY291bnQsCiAgICAgICAgICBzY2FsZT1jKDIsMC41KSwKICAgICAgICAgIG1heC53b3Jkcz01MCwKICAgICAgICAgIG1pbi5mcmVxPTEsCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsCiAgICAgICAgICByb3QucGVyPTAuMywKICAgICAgICAgIHVzZS5yLmxheW91dD1ULAogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOSwiUHVycGxlcyIpKQp0aXRsZShtYWluID0gJ0RlbW9jcmF0aWNzIGhhdmUgdHdvIG9yIG1vcmUgdGVybXMnKQoKCiMjI3JlcHViCndvcmRjbG91ZCh0ZG1fZmlyc3RfcmVwdWIkdGVybSwgdGRtX2ZpcnN0X3JlcHViJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlJlZHMiKSkKdGl0bGUobWFpbiA9ICdSZXB1YmxpY2FuIHdpdGggb25seSBvbmUgdGVybScpCgp3b3JkY2xvdWQodGRtX3NlY29uZF9yZXB1YiR0ZXJtLCB0ZG1fc2Vjb25kX3JlcHViJGNvdW50LAogICAgICAgICAgc2NhbGU9YygyLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9NTAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjMsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIlB1cnBsZXMiKSkKdGl0bGUobWFpbiA9ICdSZXB1YmxpY2FuIHdpdGggdHdvIG9yIG1vcmUgdGVybXMnKQoKCmBgYApcCkFsbCBncm91cHMgaGF2ZSB0aGVpciBvd24gc3BlY2lhbCBXb3JkQ2xvdWRzLCBidXQgd2Ugc3RpbGwgY2FuIGZpbmQgc29tZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9uZS10ZXJtIGFuZCB0d28tdGVybSBwcmVzaWRlbnRzOgoKLSBPbmUtdGVybSBwcmVzaWRlbnRzIHJlZ2FyZGxlc3Mgb2YgcGFydHkgaGF2ZSBtb3JlIHdvcmRzIHRoYXQgcGVvcGxlIGFyZSBnZW5lcmFsbHkgbW9yZSBpbnRlcmVzdGVkIGluLiAiZW1wbG95ZWUiLCJidXNpbmVzcyIsImFtZXJpY2EiIGFyZSB0aGUgd29yZHMgdGhhdCBwZW9wbGUgZ2VuZXJhbGx5IHRoaW5rIHdpbGwgYXBwZWFyIGluIGluYXVndXJhbCBzcGVlY2hlcywgc28gaXQgc2VlbXMgdGhhdCBvbmUtdGVybSBwcmVzaWRlbnRzIHRlbmQgdG8gaW5ncmF0aWF0ZSBjaXRpemVucyBieSB0YWxraW5nIHRoaW5ncyB0aGF0IGFyZSBtb3JlIHJlYWxpc3RpYy4gCi0gVHdvLXRlcm0gcHJlc2lkZW50cyByZWdhcmRsZXNzIG9mIHBhcnR5IGhhdmUgbW9yZSB3b3JkcyBvZiBhYnN0cmFjdCB0aGluZ3MuIFdvcmRzIGxpa2UgInN0cmlja2VuIiwicHJvZHVjdGl2aXR5IiBhbmQgIm1pbm9yaXR5IiBkbyBub3QgcmVsYXRlIHRvIGdlbmVyYWwgY2l0aXplbnMnIGRhaWx5IGxpZmUgdGhhdCBtdWNoLCBidXQgcHJlc2lkZW50cyB0YWxrIG1vcmUgYWJvdXQgdGhvc2UgZXZlbnR1YWxseSBnZXQgdGhlaXIgc2Vjb25kIHRlcm0uCi0gSXQgaXMgcG9zc2libGUgdGhhdCBwZW9wbGUgd2lsbCBwbGFjZSBtb3JlIGhvcGVzIG9uIHByZXNpZGVudHMgdGhhdCBwcm9taXNlIHRvIGltcHJvdmUgZWNvbm9taWNzIG9yIGJyaW5nIG1vcmUgam9icy4gSG93ZXZlciwgaXQgaXMgbm90IGVhc3kgdG8gYWN0dWFsbHkgYWNoaWV2ZSBlY29ub21pYyBwcm9zcGVyaXR5IGFzIGl0IHdpbGwgYWx3YXlzIGJlIGFmZmVjdGVkIGJ5IG1hbnkgY29tcGxpY2F0ZWQgZmFjdG9ycy4gUGVvcGxlIG1pZ2h0IGJlIGRpc2FwcG9pbnRlZCBhZnRlciB0aGV5IGZpbmlzaCB0aGVpciBmaXJzdCB0ZXJtLiBPbiBjb21wYXJpc29uLCBwcmVzaWRlbnRzIHRhbGsgbGVzcyBtaWdodCBnYWluIGxlc3MgcHJlc3N1cmUuCgpcCmBgYHtyfQojIyN0cnVtcAp3b3JkY2xvdWQodGRtLnRydW1wJHRlcm0sIHRkbS50cnVtcCRjb3VudCwKICAgICAgICAgIHNjYWxlPWMoMiwwLjUpLAogICAgICAgICAgbWF4LndvcmRzPTUwLAogICAgICAgICAgbWluLmZyZXE9MSwKICAgICAgICAgIHJhbmRvbS5vcmRlcj1GQUxTRSwKICAgICAgICAgIHJvdC5wZXI9MC4zLAogICAgICAgICAgdXNlLnIubGF5b3V0PVQsCiAgICAgICAgICByYW5kb20uY29sb3I9RkFMU0UsCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg5LCJPcmFuZ2VzIikpCnRpdGxlKG1haW4gPSAnVHJ1bXAgJykKCmBgYApcCgpUcnVtcCBoYXMgYSByZWxhdGl2ZWx5IHNwZWNpYWwgV29yZENsb3VkIGFzIGhlIHRhbGtzIGEgbG90IGFib3V0IE9iYW1hLiBGcm9tIHRoZSBXb3JkQ2xvdWQsIFRydW1wIGhhdmUgd29yZHMgbGlrZSAiYW1lcmljYSIsICJkcmVhbXMiLCAiImpvYnMiIGluZGljYXRpbmcgdGhhdCBoZSB0YWxrcyBtb3JlIGFib3V0IGhvdyB0byBtYWtlIEFtZXJpY2EgdGhyaXZlIGFnYWluIGFuZCBob3cgdG8gYnJpbmcgbW9yZSBqb2JzLiBUcnVtcCBnYWlucyBsb3RzIG9mIHN1cHBvcnQgZnJvbSBibHVlLWNvbGxhcnMgd2hvIHBsYWNlIGhvcGUgb2YgY2hhbmdpbmcgdGhlaXIgbGl2aW5nIHN0YXR1cywgYnV0IGl0IG1pZ2h0IG5vdCBiZW5lZml0IGhpbSB3aGVuIHJ1bm5pbmcgZm9yIGhpcyBzZWNvbmQgdGVybS4KXAoKCiMjIDIgLSBMZW5ndGggb2YgU2VudGVuY2VzIAoKYGBge3IsZmlnLmhlaWdodCA9IDUsZmlnLndpZHRoID0gMTB9CiMjI3NlbnRlbmNlLmxpc3QgICAgICAgICBzZW50ZW5jZSBsaXN0IG9mIGFsbCBmaWxlIGluIGRpcgojIyNzZW50ZW5jZS5saXN0LmFsbCAgICAgc2VudGVuY2UgbGlzdCBvZiBhbGwgZmlsZSBncm91cCBieSBvbmUtdGVybSBhbmQgc2Vjb25kLXRlcm0KIyMjc2V0ZW5jZS5saXN0LmRlbW8KIyMjc2V0ZW5jZS5saXN0LnJlcHViCgoKIyMjYWxsCnNlbnRlbmNlLmxpc3QuYWxsPWZpbHRlcihzZW50ZW5jZS5saXN0LCBGaWxlJWluJWMoZmlyc3RfdGVybSRGaWxlLHNlY29uZF90ZXJtJEZpbGUpKQpzZW50ZW5jZS5saXN0LmFsbCRHcm91cD1pZmVsc2Uoc2VudGVuY2UubGlzdC5hbGwkRmlsZSVpbiVmaXJzdF90ZXJtJEZpbGUsImZpcnN0Iiwic2Vjb25kIikKI3NlbnRlbmNlLmxpc3QuYWxsJGF2Zy53b3JkPC1pZmVsc2Uoc2VudGVuY2UubGlzdC5hbGwkR3JvdXA9PSJmaXJzdCIsc2VudGVuY2UubGlzdC5hbGwkd29yZC5jb3VudC9sZW5ndGgoZmlyc3QpLHNlbnRlbmNlLmxpc3QuYWxsJHdvcmQuY291bnQvbGVuZ3RoKHNlY29uZCkpCgpiZWVzd2FybSh3b3JkLmNvdW50fkdyb3VwLCAKICAgICAgICAgZGF0YT1zZW50ZW5jZS5saXN0LmFsbCwKICAgICAgICAgaG9yaXpvbnRhbCA9IEZBTFNFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YygicmVkIiwicHVycGxlIiksCiAgICAgICAgIGNleD0wLjgsIGNleC5heGlzPTEsIGNleC5sYWI9MS4yLAogICAgICAgICBsYXM9Mix5bGFiPSJOdW1iZXIgb2Ygd29yZHMiLAogICAgICAgICB4bGFiPSIiLGxhcz0xLAogICAgICAgICBtYWluPSJJbmF1Z3VhcnRpb24gc3BlZWNoZXMiKQoKIyMjZGVtbwpzZW50ZW5jZS5saXN0LmRlbW89ZmlsdGVyKHNlbnRlbmNlLmxpc3QsIEZpbGUlaW4lYyhmaXJzdF90ZXJtX2RlbW8kRmlsZSxzZWNvbmRfdGVybV9kZW1vJEZpbGUpKQpzZW50ZW5jZS5saXN0LmRlbW8kR3JvdXA9aWZlbHNlKHNlbnRlbmNlLmxpc3QuZGVtbyRGaWxlJWluJWZpcnN0X3Rlcm1fZGVtbyRGaWxlLCJmaXJzdF9kZW1vIiwic2Vjb25kX2RlbW8iKQojc2VudGVuY2UubGlzdC5kZW1vJGF2Zy53b3JkPC1pZmVsc2Uoc2VudGVuY2UubGlzdC5kZW1vJEdyb3VwPT0iZmlyc3RfZGVtbyIsc2VudGVuY2UubGlzdC5kZW1vJHdvcmQuY291bnQvbGVuZ3RoKGZpcnN0X2RlbW8pLHNlbnRlbmNlLmxpc3QuZGVtbyR3b3JkLmNvdW50L2xlbmd0aChzZWNvbmRfZGVtbykpCmJlZXN3YXJtKHdvcmQuY291bnR+R3JvdXAsIAogICAgICAgICBkYXRhPXNlbnRlbmNlLmxpc3QuZGVtbywKICAgICAgICAgaG9yaXpvbnRhbCA9IEZBTFNFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YygicmVkIiwicHVycGxlIiksCiAgICAgICAgIGNleD0wLjgsIGNleC5heGlzPTEsIGNleC5sYWI9MS4yLAogICAgICAgICBsYXM9Mix5bGFiPSJOdW1iZXIgb2Ygd29yZHMiLAogICAgICAgICB4bGFiPSIiLGxhcz0xLAogICAgICAgICBtYWluPSJJbmF1Z3VhcnRpb24gc3BlZWNoZXMiKQoKIyMjcmVwdWIKc2VudGVuY2UubGlzdC5yZXB1Yj1maWx0ZXIoc2VudGVuY2UubGlzdCwgRmlsZSVpbiVjKGZpcnN0X3Rlcm1fcmVwdWIkRmlsZSxzZWNvbmRfdGVybV9yZXB1YiRGaWxlKSkKc2VudGVuY2UubGlzdC5yZXB1YiRHcm91cD1pZmVsc2Uoc2VudGVuY2UubGlzdC5yZXB1YiRGaWxlJWluJWZpcnN0X3Rlcm1fcmVwdWIkRmlsZSwiZmlyc3RfcmVwdWIiLCJzZWNvbmRfcmVwdWIiKQojc2VudGVuY2UubGlzdC5yZXB1YiRhdmcud29yZDwtaWZlbHNlKHNlbnRlbmNlLmxpc3QucmVwdWIkR3JvdXA9PSJmaXJzdF9yZXB1YiIsc2VudGVuY2UubGlzdC5yZXB1YiR3b3JkLmNvdW50L2xlbmd0aChmaXJzdF9yZXB1Yiksc2VudGVuY2UubGlzdC5yZXB1YiR3b3JkLmNvdW50L2xlbmd0aChzZWNvbmRfcmVwdWIpKQoKYmVlc3dhcm0od29yZC5jb3VudH5Hcm91cCwgCiAgICAgICAgIGRhdGE9c2VudGVuY2UubGlzdC5yZXB1YiwKICAgICAgICAgaG9yaXpvbnRhbCA9IEZBTFNFLCAKICAgICAgICAgcGNoPTE2LCBjb2w9YygicmVkIiwicHVycGxlIiksCiAgICAgICAgIGNleD0wLjgsIGNleC5heGlzPTEsIGNleC5sYWI9MS4yLAogICAgICAgICBsYXM9Mix5bGFiPSJOdW1iZXIgb2Ygd29yZHMiLAogICAgICAgICB4bGFiPSIiLGxhcz0xLAogICAgICAgICBtYWluPSJJbmF1Z3VhcnRpb24gc3BlZWNoZXMiKQpgYGAKXApPbmx5IGZpcnN0IGluYXVndXJhbCBzcGVlY2hlcyBhcmUgcGlja2VkLiBUaGVyZSBhcmUgMjMgb25lLXRlcm0gcHJlc2lkZW50cyAqKnZzKiogMTcgc2Vjb25kLXRlcm0gcHJlc2lkZW50czsgOSBvbmUtdGVybSBkZW1vY3JhdGljIHByZXNpZGVudHMgKip2cyoqIDYgdHdvLXRlcm0gZGVtb2NyYXRpYyBwcmVzaWRlbnRzOyAxMCBvbmUtdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMgKip2cyoqIDcgdHdvLXRlcm0gcmVwdWJsaWNhbiBwcmVzaWRlbnRzLiBBcyB0aGUgbnVtYmVyIG9mIHByZXNpZGVudHMgaW4gZWFjaCBncm91cCBkaWZmZXIsIHRoZSBhbmFseXNpcyBiZWNvbWUgbW9yZSBjb21wbGljYXRlZC4gSG93ZXZlciwgd2UgY2FuIHN0aWxsIHNlZSBzb21lIHBhdHRlcm5zOgoKLSBBbGwgcHJlc2lkZW50cyB3aWxsIGhhdmUgbW9yZSBzZW50ZW5jZXMgd2l0aCBsZW5ndGggYXJvdW5kIDIwLCBoYXZlIHNpbWlsYXIgc2hhcGUgb2YgZGlzdHJpYnV0aW9uIG9mIHNlbnRlbmNlIGxlbmd0aC4KLSBUd28tdGVybSBwcmVzaWRlbnRzIHRlbmRzIHRvIGhhdmUgcmVsYXRpdmVseSBtb3JlIG51bWJlciBvZiBzZW50ZW5jZS4gV2UgY2FuIHNlZSBpdCB0aHJvdWdoIHRoZSBmaXJzdCBwbG90LiBBbHRob3VnaCB0aGVyZSBhcmUgMjMgb25lLXRlcm0gcHJlc2lkZW50cyBidXQgMTcgdHdvLXRlcm0gcHJlc2lkZW50cywgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgbGVzcyBzZW50ZW5jZXMgaW4gdHdvLXRlcm0gcHJlc2lkZW50cy4KLSBUd28tdGVybSBkZW1vY3JhdGljIHByZXNpZGVudHMgaGF2ZSAqKm1vcmUgZXZlbioqIHN0cnVjdHVyZSBvZiBzZW50ZW5jZSBsZW5ndGggY29tcGFyZWQgdG8gb25lLXRlcm0gZGVtb2NyYXRpYyBwcmVzaWRlbnRzLiBIb3dldmVyLCB0d28tdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMgaGF2ZSAqKmxlc3MgZXZlbioqIHN0cnVjdHVyZSBjb21wYXJlZCB0byBvbmUtdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMuCgpcCgoKYGBge3J9CgojIyNUcnVtcApzZW50ZW5jZS50bz1maWx0ZXIoc2VudGVuY2UubGlzdCwgRmlsZSVpbiVjKCJEb25hbGRKVHJ1bXAiLCJCYXJhY2tPYmFtYSIpKQpzZW50ZW5jZS50byRHcm91cD1pZmVsc2Uoc2VudGVuY2UudG8kRmlsZT09IkRvbmFsZEpUcnVtcCIsIlRydW1wIiwiT2JhbWEiKQpiZWVzd2FybShzZW50ZW5jZS50byR3b3JkLmNvdW50fkdyb3VwLAogICAgICAgICBkYXRhPXNlbnRlbmNlLnRvLAogICAgICAgICBob3Jpem9udGFsID0gRkFMU0UsCiAgICAgICAgIHBjaD0xNiwgY29sPWJyZXdlci5wYWwoMywiRGFyazIiKSwKICAgICAgICAgY2V4PTAuOCwgY2V4LmF4aXM9MSwgY2V4LmxhYj0xLjIsCiAgICAgICAgIGxhcz0yLHlsYWI9Ik51bWJlciBvZiB3b3JkcyIsCiAgICAgICAgIHhsYWI9IiIsbGFzPTEsCiAgICAgICAgIG1haW49IkluYXVndWFydGlvbiBzcGVlY2hlcyIpCgoKYGBgClwKQ29tcGFyZWQgdG8gT2JhbWEncyBmaXJzdC10ZXJtIGluYXVndXJhbCBzcGVlY2gsIFRydW1wIGhhcyBzb21lIGV4dHJhIGxvbmcgc2VudGVuY2VzLiBUcnVtcCBoYXMgYSBzcGVjaWFsbHkgZXZlbiBzdHJ1Y3R1cmUgb2Ygc2VudGVuY2UgbGVuZ3RoIHdoaWNoIGlzIGNsb3Nlc3QgdGhlIG9uZS10ZXJtIHJlcHVibGljYW4gcHJlc2lkZW50cyBjb21wYXJlZCB0byBvdGhlciBncm91cHMuIAoKClwKCgojIyAzIC0gU2VudGltZW50CmBgYHtyLGZpZy5oZWlnaHQgPSA4LGZpZy53aWR0aCA9IDh9CnBhcihtZnJvdz1jKDMsMikpCgplbW8uYmFycGxvdDwtZnVuY3Rpb24oZ3JvdXAsZGF0YSl7CiAgcGFyKG1hcj1jKDQsIDYsIDIsIDEpKQogIGVtby5tZWFucz1jb2xNZWFucyhzZWxlY3Qoc3Vic2V0KGRhdGEsZGF0YSRHcm91cD09Z3JvdXApLCBhbmdlcjp0cnVzdCk+MC4wMSxuYS5ybT1UUlVFKQogIGJhcnBsb3QoZW1vLm1lYW5zLCBsYXM9MiwgY29sPWJyZXdlci5wYWwoOCwiU2V0MyIpLCBob3Jpej1ULGJvcmRlcj1GLG1haW49Z3JvdXApCn0KCgogIyMjYWxsCmVtby5iYXJwbG90KCJmaXJzdCIsc2VudGVuY2UubGlzdC5hbGwpCmVtby5iYXJwbG90KCJzZWNvbmQiLHNlbnRlbmNlLmxpc3QuYWxsKQoKIyMjZGVtbwplbW8uYmFycGxvdCgiZmlyc3RfZGVtbyIsc2VudGVuY2UubGlzdC5kZW1vKQplbW8uYmFycGxvdCgic2Vjb25kX2RlbW8iLHNlbnRlbmNlLmxpc3QuZGVtbykKCiMjI3JlcHViCmVtby5iYXJwbG90KCJmaXJzdF9yZXB1YiIsc2VudGVuY2UubGlzdC5yZXB1YikKZW1vLmJhcnBsb3QoInNlY29uZF9yZXB1YiIsc2VudGVuY2UubGlzdC5yZXB1YikKCgpgYGAKXAoKV2UgY2FuIHNlZSB0aGF0IHRoZSBkaXN0cmlidXRpb25zIG9mIGVtb3Rpb25zIGFyZSBzaW1pbGFyIGFtb25nIHRob3NlIGdyb3VwczoKCi0gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAqKmpveSBhbmQgZmVhcioqIGhhcyBpdHMgb3duIGRpc3RpbmN0IHBhdHRlcm46IEZyb20gYWxsIHRocmVlIGdyb3VwcyBvZiBjb21wYXJpc29ucywgd2UgY2FuIHNlZSB0aGF0IHByZXNpZGVudHMgd2l0aCAyIG9yIG1vcmUgdGVybXMgd2lsbCBoYXZlIGNsb3NlciBhbW91bnQgb2YgZW1vdGlvbiBjb3JlcyBiZXR3ZWVuIGpveSBhbmQgZmVhciwgd2hpY2ggaXMgdG8gc2F5IHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28gZW1vdGlvbnMgYmVjb21lcyBzbWFsbGVyLgotIEdlbmVyYWxseSwgdHdvLXRlcm0gcHJlc2lkZW50cyB3aWxsIGhhdmUgbW9yZSBlbW90aW9uIG9mICoqc2FkbmVzcyBjb21wYXJlZCB0byBzdXJwcmlzZSoqLCBidXQgb25lLXRlcm0gcmVwdWJsaWNhbiBpcyBhbiBleGNlcHRpb24uIEZvciBvbmUtdGVybSByZXB1YmxpY2FuIHByZXNpZGVudHMsIHRoZXkgaGF2ZSB3ZWlnaCBtb3JlIGVtb3Rpb24gb2Ygc2FkbmVzcy4KCgoKXAoKYGBge3J9CiMjI1RydW1wCiBlbW8ubWVhbnM9Y29sTWVhbnMoc2VsZWN0KHN1YnNldChzZW50ZW5jZS5saXN0LmFsbCxzZW50ZW5jZS5saXN0LmFsbCRQcmVzaWRlbnQ9PSJEb25hbGQgSi4gVHJ1bXAiKSwgYW5nZXI6dHJ1c3QpPjAuMDEsbmEucm09VFJVRSkKIGJhcnBsb3QoZW1vLm1lYW5zLCBsYXM9MiwgY29sPWJyZXdlci5wYWwoOCwiU2V0MyIpLCBob3Jpej1ULGJvcmRlcj1GLCBtYWluPSJEb25hbGQgSi4gVHJ1bXAiKQpgYGAKXApUcnVtcCBoYXMgcmVsYXRpdmVseSBsYXJnZSBkaWZmZXJlbmNlIGJldHdlZW4gam95IGFuZCBmZWFyIGFuZCBsZXNzIGVtb3Rpb24gb2YgZmVhciBpbiBoaXMgaW5hdWd1cmFsIHNwZWVjaCwgYnV0IGhlIGhhcyBmYXIgbGVzcyBlbW90aW9uIG9mIHNhZG5lc3MgY29tcGFyZWQgdG8gc3VycHJpc2UgaW4gaGlzIHNwZWVjaC4KRnJvbSB0aGUgam95IGFuZCBmZWFyIHBhdHRlcm4sIFRydW1wIGhhcyBncmVhdGVyIHBvc3NpYmlsaXR5IHRvIGJlIGEgb25lLXRlcm0gcHJlc2lkZW50LCBidXQgaGUgYWxzbyBnZXRzIHRoZSBjaGFuZ2UgdG8gYmUgdHdvLXRlcm0gcHJlc2lkZW50IGZyb20gc2FkbmVzcyBhbmQgc3VycHJpc2UgcGF0dGVybi4KClwKCgojIyA0IC0gQ29uY2x1c2lvbgpcCgohW10oaHR0cDovL2QzNjY2NzZsODltaXFtLmNsb3VkZnJvbnQubmV0L3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzA4Lzk2OTM5X0RvbmFsZC1UcnVtcC15b3VyZS1maXJlZC0xMDI0eDU5Ny5qcGcpe3dpZHRoPTUwJX0KClwKXApXZSBjYW4gc2VlIHRoYXQgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBwYXR0ZXJucyBiZXR3ZWVuIG9uZS10ZXJtIHByZXNlbnRzIGFuZCB0d28tdGVybSBwcmVzaWRlbnQuIApPbmx5IHRocm91Z2ggdGhlIGFuYWx5c2lzIGFib3ZlLCBJIHdpbGwgYW50aWNpcGF0ZSB0aGF0IFRydW1wICoqd2lsbCBub3QqKiBoYXZlIGhpcyBzZWNvbmQgdGVybToKCi0gQSBXb3JkIENsb3VkIG1vcmUgbGlrZSBhIG9uZS10ZXJtIGRlbW9jcmF0aWMgcHJlc2lkZW50Ci0gRXZlbiBzdHJ1Y3R1cmUgb2Ygd29yZCBsZW5ndGggaW4gc2VudGVuY2VzIG1vcmUgbGlrZSBhIG9uZS10ZXJtIHJlcHVibGljYW4gcHJlc2lkZW50Ci0gUmVsYXRpdmVseSBsYXJnZSBhbW91bnQgb2YgZGlmZmVyZW5jZSBiZXR3ZWVuIGZlYXIgYW5kIGpveQoKSG93ZXZlciwgdW50aWwgbm93IHRoZXJlIGlzIG5vdCB5ZXQgYSBzdHJvbmcgY29tcGV0aXRvcnMgYXBwZWFyaW5nLCBhbmQgZXZlbiB3ZWxsLWRlc2lnbmVkIHBvbGxzIGNhbm5vdCBnaXZlIGEgZXhhY3QgYW50aWNpcGF0aW9uIG9mIGVsZWN0aW9uIHJlc3VsdC4gSSBiZWxpZXZlIHdlIGNhbm5vdCBtYWtlIGEgY29uY2x1c2lvbiBieSBvbmx5IHJlZmVyZW5jaW5nIGluYXVndXJhbCBzcGVlY2hlcywgYnV0IGl0IGlzIHN0aWxsIGZ1biB0byBzZWUgdGhpcyBraW5kIG9mIHRoZSBhbmFseXNpcy4KXApcClwKXAoK